package storage;

import general.Flag;
import general.Status;

/**
 * Base interface for storage
 */
interface StorageAdapter
{
	/**
	 * Сбрасывает базу данных
	 * 
	 * @throws StorageException при неудаче
	 * @author Last G
	 */
	public abstract void flushDB() throws StorageException;
	
	/**
	 * Кладёт некий флаг в базу и возвращает его идентификатор
	 * 
	 * @param fl
	 *            флаг, который кладём в базу
	 * @return идентификатор флага
	 * 
	 * @author Last G
	 * @throws StorageException
	 *             откат транзкции или флаг некорректен
	 * 
	 */
	public abstract int putFlag(Flag fl) throws StorageException;

	/**
	 * Берёт конкретный флаг по идентификатору
	 * 
	 * @param id
	 *            идентификатор флага
	 * @return массив флагов с идентификатором
	 * @throws StorageException
	 *             откат транзкции ?
	 * @author Last G
	 */
	public abstract Flag getFlag(int id) throws StorageException;

	/**
	 * Берёт конкретный флаг по идентификатору и меняет его статус на Busy хотя,
	 * фактически, в терминах БД блокировки и не поисходит
	 * 
	 * @param id
	 *            идентификатор флага
	 * @return массив флагов с идентификатором
	 * @throws StorageException
	 *             откат транзкции ?
	 * @author Last G
	 */
	public abstract Flag getFlagAndLock(int id) throws StorageException;

	/**
	 * Берёт limit флагов из базы с заданным статусом
	 * 
	 * @param state
	 *            состояние флага в базе
	 * @param limit
	 *            ограничение по количеству флагов
	 * @return массив флагов
	 * @throws StorageException
	 *             откат транзкции ?
	 * @author Last G
	 */
	public abstract Flag[] getFlags(Status state, int limit)
			throws StorageException;

	/**
	 * Берёт limit флагов из базы с заданным статусом и меняет их статус на Busy
	 * хотя, фактически, в терминах БД блокировки и не поисходит
	 * 
	 * @param state
	 *            состояние флага в базе
	 * @param limit
	 *            ограничение по количеству флагов
	 * @return массив флагов
	 * @throws StorageException
	 *             откат транзкции ?
	 * @author Last G
	 */
	public abstract Flag[] getFlagsAndLock(Status state, int limit)
			throws StorageException;

	/**
	 * Меняет статус указанных флагов в базе данных
	 * 
	 * @param flags
	 *            флаги для смены статуса
	 * @param statuses
	 *            новый статус
	 * @throws StorageException
	 *             откат транзкции ?
	 * @author Last G
	 */
	public abstract void updateStatus(Flag[] flags, Status[] statuses)
			throws StorageException;

}